Also allow boolean cmdline params to be inverted in two other ways.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 9 Jul 2007 13:29:53 +0000 (14:29 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 9 Jul 2007 13:29:53 +0000 (14:29 +0100)
Now, a standard boolean (e.g., watchdog) can be inverted in three
ways:
 1. no-watchdog
 2. watchdog=no
 3. watchdog=off

Stacked inversions cancel each other: no-watchdog=no turns on the
watchdog.

Signed-off-by: Keir Fraser <keir@xensource.com>
xen/common/kernel.c
xen/include/xen/init.h

index fea3224a767a37b32d13b854ea500d3160e7a216..0e675d3c4b691fd889d13bdceef306c72cda1e3b 100644 (file)
@@ -29,7 +29,7 @@ void cmdline_parse(char *cmdline)
     char opt[100], *optval, *optkey, *q;
     const char *p = cmdline;
     struct kernel_param *param;
-    int invbool;
+    int bool_assert;
 
     if ( p == NULL )
         return;
@@ -66,8 +66,8 @@ void cmdline_parse(char *cmdline)
             optval = q;       /* default option value is empty string */
 
         /* Boolean parameters can be inverted with 'no-' prefix. */
-        invbool = !strncmp("no-", optkey, 3);
-        if ( invbool )
+        bool_assert = !!strncmp("no-", optkey, 3);
+        if ( !bool_assert )
             optkey += 3;
 
         for ( param = &__setup_start; param <= &__setup_end; param++ )
@@ -85,10 +85,12 @@ void cmdline_parse(char *cmdline)
                     simple_strtol(optval, (const char **)&optval, 0);
                 break;
             case OPT_BOOL:
-                *(int *)param->var = !invbool;
-                break;
             case OPT_INVBOOL:
-                *(int *)param->var = invbool;
+                if ( !strcmp("no", optval) || !strcmp("off", optval) )
+                    bool_assert = !bool_assert;
+                if ( param->type == OPT_INVBOOL )
+                    bool_assert = !bool_assert;
+                *(int *)param->var = bool_assert;
                 break;
             case OPT_CUSTOM:
                 ((void (*)(const char *))param->var)(optval);
index f5afd0cfa104bd00c3722086b411087010de671d..7e79e52fe35da6c656a8b10326bfba180ecfc1c5 100644 (file)
@@ -93,7 +93,7 @@ extern struct kernel_param __setup_start, __setup_end;
     static char __setup_str_##_var[] __initdata = _name; \
     static struct kernel_param __setup_##_var __attribute_used__ \
         __initsetup = { __setup_str_##_var, OPT_BOOL, &_var, sizeof(_var) }
-#define invboolean_param(_name, _var) \
+#define invbool_param(_name, _var) \
     static char __setup_str_##_var[] __initdata = _name; \
     static struct kernel_param __setup_##_var __attribute_used__ \
         __initsetup = { __setup_str_##_var, OPT_INVBOOL, &_var, sizeof(_var) }